package ar.edu.utn.frba.disenio.aterrizar.aerolineas;

import java.util.ArrayList;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.*;
import ar.edu.utn.frba.disenio.aterrizar.fechas.Fecha;
import ar.edu.utn.frba.disenio.aterrizar.usuario.Usuario;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.*;

public class AdapterLanchita extends Aerolinea {
	
	protected AerolineaLanchita aerolinea;
	private boolean centinel = true;
	
	public AdapterLanchita(){
		this.aerolinea = AerolineaLanchita.getInstance();
		this.setRecargoAerolinea(1.15);
		this.nombreAerolinea = "Lanchita";
	}
	
	public AdapterLanchita(AerolineaLanchita mock){
		this.aerolinea = mock;
		this.setRecargoAerolinea(1.15);
		nombreAerolinea = "Lanchita";
	}
	
	
	private ArrayList<Vuelo> asientosTotales(){
		
		String[][] asientosTotales = aerolinea.asientosDisponibles(null, null, null, null, null, null);
		
		ArrayList<Vuelo> retVal = new ArrayList<Vuelo>();
		
		for(String[] unAsiento : asientosTotales){
			Vuelo unVuelo = new Vuelo(unAsiento);
			unVuelo.setAerolinea(this.nombreAerolinea);
			retVal.add(unVuelo);
        }  
		return retVal;
	}
	
	@Override
	public ArrayList<Vuelo> buscarVuelos(CriterioBusqueda unaBusqueda){
		
		ArrayList<Vuelo>  disponibles = this.asientosTotales();
		ArrayList<Vuelo>  retVal = new ArrayList<Vuelo>();
		
		for(Vuelo unVuelo : disponibles){
			if((unaBusqueda.fecha.fechaEstasEntre(unVuelo.fechaSalida, unVuelo.fechaLlegada))&&(unaBusqueda.getOrigen().equals(unVuelo.origen))&&(unaBusqueda.getDestino().equals(unVuelo.destino))){
				unVuelo.setAerolinea(this.nombreAerolinea);
				retVal.add(unVuelo);
			}			
        }  
		return retVal;
    }
	
	@Override
	public ArrayList<Vuelo> buscarVuelosPorOrigen(String origen, Fecha fechaDeSalida) {
		
		ArrayList<Vuelo>  disponibles = this.asientosTotales();
		ArrayList<Vuelo>  retVal = new ArrayList<Vuelo>();
		
		for(Vuelo unVuelo : disponibles){
			if((fechaDeSalida.convertirAString().equals(unVuelo.fechaSalida.convertirAString()))&&(origen.equals(unVuelo.origen))){
				unVuelo.setAerolinea(this.nombreAerolinea);
				retVal.add(unVuelo);
			}			
        }  	
		return retVal;
	}
	
	
	public Vuelo buscarVueloParticular(String codigo, Usuario usuario){
		
		ArrayList<Vuelo> asientosTotales = this.asientosTotales();
		
		String [] parserCodigo = codigo.split("&");
		if(codigo.length() == parserCodigo[0].length())	{
		
			for(Vuelo unVuelo : asientosTotales)	{
				if(unVuelo.codigo.equals(codigo))	{
					unVuelo.aplicarRecargo(this.recargoAerolinea, usuario.getRecargoUsuario());
					unVuelo.setAerolinea(this.nombreAerolinea);
					return unVuelo;				 
				}			
	        }  
			throw new AsientoErroneoException();
		} else {
			VueloConEscalas vueloConEscalas = new VueloConEscalas();
			vueloConEscalas.setAerolinea(this.nombreAerolinea);
			for(int i = 0; i < parserCodigo.length; i++)	{
				for(Vuelo unVuelo : asientosTotales)	{
					if(unVuelo.codigo.equals(parserCodigo[i]))	{
						unVuelo.setAerolinea(this.nombreAerolinea);
						vueloConEscalas.agregarVuelo(unVuelo);
						this.centinel = false;
					}	
				}
				if(centinel)	{
					throw new AsientoErroneoException();
				}
				this.centinel = true;
			}
			
			vueloConEscalas.aplicarRecargo(this.recargoAerolinea,usuario.getRecargoUsuario());
			return vueloConEscalas;
		}
    }

	@Override
	public void comprarAsiento(String codigoAsiento, Usuario unUsuario){
		
		String [] parserCodigo = codigoAsiento.split("&");
		if(codigoAsiento.length() == parserCodigo[0].length())	{
		
			try
			{
				aerolinea.comprar(codigoAsiento);
			}
			catch(EstadoErroneoException e)
			{
				throw new AsientoNoDisponibleException();
			}
			catch(CodigoErroneoException e){
				throw new AsientoErroneoException();
			}
			
		} else {
			for (int i = 0; i < parserCodigo.length; i++)	{
				try
				{
					aerolinea.comprar(parserCodigo[i]);
				}
				catch(EstadoErroneoException e)
				{
					throw new AsientoNoDisponibleException();
				}
				catch(CodigoErroneoException e){
					throw new AsientoErroneoException();
				}
			}
		}
		
	}
	
	@Override
	public void reservar(String codigoAsiento, Usuario usuario) {
		
		String [] parserCodigo = codigoAsiento.split("&");
		if(codigoAsiento.length() == parserCodigo[0].length())	{
			try
			{
				aerolinea.reservar(codigoAsiento,usuario.getDni());
			}
			catch(EstadoErroneoException e)
			{
				throw new AsientoNoDisponibleException();
			}
		} else {
			for (int i = 0; i < parserCodigo.length; i++)	{
				try
				{
					aerolinea.reservar(parserCodigo[i],usuario.getDni());
				}
				catch(EstadoErroneoException e)
				{
					throw new AsientoNoDisponibleException();
				}
			}
		}
		
	}

	
}